48c48
< 	int projseen,firstsrc;
---
> 	int projseen,firstsrc,cpychar;
53a54,55
>   if((ascptr= fopen("ASCIIFIL.$$$","wb")) == NULL){
> 	fprintf(stderr,"Cannot open ASCIIFIL.$$$ \n"); exit(1);}
148c150
< 		if ((uitptr = fopen(filechar, "w")) == NULL)
---
> 		if ((uitptr = fopen(filechar, "wb")) == NULL)
153c155
< 	if ((outFile=fopen(filechar,"w")) == NULL)
---
> 	if ((outFile=fopen(filechar,"wb")) == NULL)
165,168c167,170
< 	if (((inptr = fopen(p, "r")) == NULL) &&
< 	    ((inptr = fopen(ffnm, "r")) == NULL) &&
< 	     ((inptr = fopen(filsnm, "r")) == NULL) &&
< 	      ((inptr = fopen(filcapnm, "r")) == NULL))
---
> 	if (((inptr = fopen(p, "rb")) == NULL) &&
> 	    ((inptr = fopen(ffnm, "rb")) == NULL) &&
> 	     ((inptr = fopen(filsnm, "rb")) == NULL) &&
> 	      ((inptr = fopen(filcapnm, "rb")) == NULL))
175,177c177,179
< 	    if (((inptr = fopen(p, "r")) == NULL) &&
< 	    	((inptr = fopen(filsnm, "r")) == NULL) &&
< 	      	    ((inptr = fopen(filcapnm, "r")) == NULL))
---
> 	    if (((inptr = fopen(p, "rb")) == NULL) &&
> 	    	((inptr = fopen(filsnm, "rb")) == NULL) &&
> 	      	    ((inptr = fopen(filcapnm, "rb")) == NULL))
199a202,207
> 		if ((inptr = fopen("ASCIIFIL.$$$", "rb")) == NULL)
> 			fatal("can't open ASCIIFIL.$$$");
> 		if ((uitptr = fopen(filechar, "wb")) == NULL)
> 			fatal("can't open %s", filechar);
> 	while((cpychar=getc(inptr)) != EOF) putc(cpychar,uitptr);
> 	fclose(inptr); fclose(uitptr);
235c243
< 	if ((input = fopen(filechar, "r")) == NULL)
---
> 	if ((input = fopen(filechar, "rb")) == NULL)
255,334c263
< 			archive();
< 			fclose(input);
< 			/* continue;*/
< 		}
< 		rewind(input);
< #endif
< 		parse(p);
< 		fclose(input);
< 		/*break;*/
< 	}
< #ifndef ASLD
< 	if (nfile == 0) {
< 		input = stdin;
< 		parse("STDIN");
< 	}
< #endif
< 	commfinish();
< 	machfinish(PASS_1);
< #ifdef ASLD
< 	if (unresolved) {
< 		register int i;
< 
< 		nerrors++;
< 		fflush(stdout);
< 		fprintf(stderr, "unresolved references:\n");
< 		for (i = 0; i < H_SIZE; i++) {
< 			ip = hashtab[H_GLOBAL+i];
< 			while (ip != 0) {
< 				if ((ip->i_type & (S_EXT|S_TYP)) == (S_EXT|S_UND))
< 					fprintf(stderr, "\t%s\n", ip->i_name);
< 				ip = ip->i_next;
< 			}
< 		}
< 	}
< #else
< 	if (unresolved)
< 		outhead.oh_flags |= HF_LINK;
< 	/*
< 	if (nfile == 0)
< 		fatal("no source file");
< 	*/
< #endif
< }
< 
< #ifdef ASLD
< 
< archive() {
< 	register long offset;
< 	struct ar_hdr header;
< 	char getsize[AR_TOTAL];
< 
< 	archmode++;
< 	offset = 2;
< 	for (;;) {
< 		if (unresolved == 0)
< 			break;
< 		fseek(input,offset,0);
< 		if (fread(getsize,AR_TOTAL,1,input) != 1)
< 			break;
< 		offset += AR_TOTAL;
< 		strncpy(header.ar_name,getsize,sizeof header.ar_name) ;
< 		header.ar_size= (((((long) (getsize[AR_SIZE+1]&0377))<<8)+
< 				((long) (getsize[AR_SIZE  ]&0377))<<8)+
< 				((long) (getsize[AR_SIZE+3]&0377))<<8)+
< 				((long) (getsize[AR_SIZE+2]&0377)) ;
< 		archsize = header.ar_size;
< 		if (needed()) {
< 			fseek(input,offset,0);
< 			archsize = header.ar_size;
< 			header.ar_name[14] = '\0';
< 			parse(remember(header.ar_name));
< 		}
< 		offset += header.ar_size;
< 		while (offset % 2)
< 			offset++;
< 	}
< 	archmode = 0;
< }
< 
< needed()
---
> char *s;
336,368c265
< 	register c, first;
< 	register item_t *ip;
< 	register need;
< 
< #ifdef LISTING
< 	register save;
< 
< 	save = listflag; listflag = 0;
< #endif
< 	need = 0;
< 	peekc = -1;
< 	first = 1;
< 	for (;;) {
< 		c = nextchar();
< 		if (c == '\n') {
< 			first = 1;
< 			continue;
< 		}
< 		if (c == ' ' || c == '\t' || c == ',')
< 			continue;
< 		if (ISALPHA(c) == 0)
< 			break;
< 		if ((ip = item_search(readident(c))) == 0) {
< 			if (first)
< 				break;
< 			continue;
< 		}
< 		if (first) {
< 			if (ip == &keytab[KEYSECT]) {
< 				while ((c = nextchar()) != '\n')
< 					;
< 				continue;
< 			}
---
> 	static char nmbuf[STRINGMAX];
370,377c267,270
< 			if (ip != &keytab[KEYDEFINE])
< 				break;
< 			first = 0;
< 		}
< 		if ((ip->i_type & S_TYP) == S_UND) {
< 			need++;
< 			break;
< 		}
---
> 	switchsect(S_UND);
> 	if (s && s != modulename) {
> 		strncpy(nmbuf, s, STRINGMAX-1);
> 		modulename = nmbuf;
378a272,281
> 	else modulename = s;
> 	lineno = 1;
> #ifdef NEEDED
>         /*
>          * problem: it shows the name of the tempfile, not any name
>          * the user is familiar with. Moreover, it is not reproducable.
>          */
>         if ((sflag & (SYM_EXT|SYM_LOC|SYM_LAB)) && PASS_SYMB)
>                 newsymb(s, S_MOD, 0, (valu_t)0);
> #endif
380c283,286
< 	listflag = save;
---
> 	listtemp = 0;
> 	if (dflag & 01000)
> 		listtemp = listmode;
> 	listflag = listtemp;
382d287
< 	return(need);
384d288
< #endif /* ASLD */
386,387c290
< parse(s)
< char *s;
---
> setupoutput()
389,391c292,295
< 	register i;
< 	register item_t *ip;
< 	register char *p;
---
> 	register sect_t *sp;
> 	register long off;
> 	struct outsect outsect;
> 	register struct outsect *pos = &outsect;
393,437c297,298
< 	for (p = s; *p; )
< 		if (*p++ == '/')
< 			s = p;
< #ifdef ASLD
< 	yylval.y_strp = s;
< 	putval(MODULE);
< #endif
< 	for (i = 0; i < FB_SIZE; i++)
< 		fb_ptr[FB_BACK+i] = 0;
< 	newmodule(s);
< 	peekc = -1;
< 	yyparse();
< 	/*
< 	 * Check for undefined symbols
< 	 */
< #ifdef ASLD
< 	for (i = 0; i < H_SIZE; i++) {
< 		while (ip = hashtab[H_LOCAL+i]) {
< 			/*
< 			 * cleanup local queue
< 			 */
< 			hashtab[H_LOCAL+i] = ip->i_next;
< 			/*
< 			 * make undefined references extern
< 			 */
< 			if ((ip->i_type & (S_VAR|S_TYP)) == S_UND) 
< 				ip->i_type |= S_EXT;
< 			/*
< 			 * relink externals in global queue
< 			 */
< 			if (ip->i_type & S_EXT)
< 				item_insert(ip, H_GLOBAL+i);
< 		}
< 	}
< #else
< 	for (i = 0; i < H_SIZE; i++) {
< 		for (ip = hashtab[H_LOCAL+i]; ip; ip = ip->i_next) {
< 			if (ip->i_type & S_EXT)
< 				continue;
< 			if (ip->i_type != S_UND)
< 				continue;
< 			if (uflag == 0)
< 				serror("undefined symbol %s", ip->i_name);
< 			ip->i_type |= S_EXT;
< 		}
---
> 	if (! wr_open(aoutpath)) {
> 		fatal("comm4 can't create %s", aoutpath);
439c300
< #endif
---
> 	wr_ohead(&outhead);
441c302
< 	 * Check for undefined numeric labels
---
> 	 * section table generation
443,447c304,314
< 	for (i = 0; i < FB_SIZE; i++) {
< 		if ((ip = fb_ptr[FB_FORW+i]) == 0)
< 			continue;
< 		serror("undefined label %d", i);
< 		fb_ptr[FB_FORW+i] = 0;
---
> 	off = SZ_HEAD;
> 	off += (long)outhead.oh_nsect * SZ_SECT;
> 	for (sp = sect; sp < &sect[outhead.oh_nsect]; sp++) {
> 		sp->s_foff = off;
> 		pos->os_base = SETBASE(sp);
> 		pos->os_size = sp->s_size + sp->s_comm;
> 		pos->os_foff = sp->s_foff;
> 		pos->os_flen = sp->s_size - sp->s_zero;
> 		pos->os_lign = sp->s_lign;
> 		off += pos->os_flen;
> 		wr_sect(pos, 1);
448a316,322
> #ifdef RELOCATION
> 	off += (long)outhead.oh_nrelo * SZ_RELO;
> #endif
> 	if (sflag == 0)
> 		return;
> 	off += (long)outhead.oh_nname * SZ_NAME;
> 	outhead.oh_nchar = off;	/* see newsymb() */
451c325
< pass_23(n)
---
> commfinish()
453,455c327,328
< 	register i;
< #ifdef ASLD
< 	register ADDR_T base = 0;
---
> #ifndef ASLD
> 	register int i;
456a330,331
> 	register struct common_t *cp;
> 	register item_t *ip;
457a333
> 	register valu_t addr;
459,466c335,342
< 	if (nerrors)
< 		stop(0);
< 	pass = n;
< #ifdef LISTING
< 	listmode >>= 3;
< 	if (listmode & 4)
< 		ffreopen(listpath, listfile);
< 	listeoln = 1;
---
> 	switchsect(S_UND);
> 	/*
> 	 * assign .comm labels and produce .comm symbol table entries
> 	 */
> 	for (cp = commons; cp; cp = cp->c_next) {
> 		ip = cp->c_it;
> #ifndef ASLD
> 		if (!( ip->i_type & S_EXT)) {
468,470c344,350
< #ifdef THREE_PASS
< 	bitindex = -1;
< 	nbits = BITCHUNK;
---
> 			sp = &sect[(ip->i_type & S_TYP) - S_MIN];
> 			if (pass == PASS_1) {
> 				addr = sp->s_size + sp->s_comm;
> 				sp->s_comm += ip->i_valu;
> 				ip->i_valu = addr;
> #ifndef ASLD
> 				ip->i_type &= ~S_COM;
472,475c352
< 	for (i = 0; i < FB_SIZE; i++)
< 		fb_ptr[FB_FORW+i] = fb_ptr[FB_HEAD+i];
< 	outhead.oh_nemit = 0;
< 	for (sp = sect; sp < &sect[outhead.oh_nsect]; sp++) {
---
> 			}
477,495d353
< 		if (sp->s_flag & BASED) {
< 			base = sp->s_base;
< 			if (base % sp->s_lign)
< 				fatal("base not aligned");
< 		} else {
< 			base += (sp->s_lign - 1);
< 			base -= (base % sp->s_lign);
< 			sp->s_base = base;
< 		}
< 		base += sp->s_size;
< 		base += sp->s_comm;
< #endif
< 		outhead.oh_nemit += sp->s_size - sp->s_zero;
< 	}
< 	if (pass == PASS_3) 
< 		setupoutput();
< 	for (sp = sect; sp < &sect[outhead.oh_nsect]; sp++) {
< 		sp->s_size = 0;
< 		sp->s_zero = 0;
497c355,357
< 		sp->s_gain = 0;
---
> 			if (pass == PASS_2) {
> 				ip->i_valu -= sp->s_gain;
> 			}
498a359,385
> 			if ((sflag & SYM_EXT) && PASS_SYMB)
> 				newsymb(
> 					ip->i_name,
> 					ip->i_type & (S_EXT|S_TYP),
> 					0,
> 					load(ip)
> 				);
> #else /* not ASLD */
> #ifdef THREE_PASS
> 			if (pass == PASS_2) {
> 				cp->c_size -= sp->s_gain;
> 			}
> #endif /* THREE_PASS */
> 		}
> 		if (pass == PASS_1) cp->c_size = ip->i_valu;
> 		if (PASS_SYMB) {
> 			if (pass != PASS_3 && (ip->i_type & S_EXT)) {
> 				ip->i_valu = outhead.oh_nname;
> 			}
> 			newsymb(
> 				ip->i_name,
> 				ip->i_type,
> 				0,
> 				cp->c_size
> 			);
> 		}
> #endif /* not ASLD */
500c387,388
< 	machstart(n);
---
> 	if (PASS_SYMB == 0)
> 		return;
502,507c390,423
< 	newmodule(modulename);
< #endif /* ASLD */
< 	ffreopen(temppath, tempfile);
< 	yyparse();
< 	commfinish();
< 	machfinish(n);
---
> 	/*
> 	 * produce symbol table entries for undefined's
> 	 */
> 	for (i = 0; i<H_SIZE; i++)
> 		for (ip = hashtab[H_LOCAL+i]; ip; ip = ip->i_next) {
> 			if (ip->i_type != (S_EXT|S_UND))
> 				continue;
> 			if (pass != PASS_3)
> 				/*
> 				 * save symbol table index
> 				 * for possible relocation
> 				 */
> 				ip->i_valu = outhead.oh_nname;
> 			newsymb(
> 				ip->i_name,
> 				S_EXT|S_UND,
> 				0,
> 				(valu_t)0
> 			);
> 		}
> #endif /* not ASLD */
> 	/*
> 	 * produce symbol table entries for sections
> 	 */
> 	if (sflag & SYM_SCT)
> 		for (sp = sect; sp < &sect[outhead.oh_nsect]; sp++) {
> 			ip = sp->s_item;
> 			newsymb(
> 				ip->i_name,
> 				(ip->i_type | S_SCT),
> 				0,
> 				load(ip)
> 			);
> 		}
509,510c425,518
< 
< newmodule(s)
---
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
> /* $Header: comm4.c,v 2.17 91/12/17 14:55:13 ceriel Exp $ */
